#!/usr/bin/env.python
# _*_ coding:utf-8 _*_
# # # # # # # # # # # # # # # # # # # #
#  题目:      manager启动文件          #
#  姓名:         李吉辉                #
#  时间:    2018年11月27日20:14:06     #
# # # # # # # # # # # # # # # # # # # #
# from flask import Flask, session
# from flask_sqlalchemy import SQLAlchemy
# from redis import StrictRedis
# from flask_wtf.csrf import CSRFProtect
# from flask_session import Session
from flask import current_app
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from info import create_app, db
from info.models import User

# 从单一职责的原则来考虑，manager文件只需要启动项目，其余不相关的代码都应该抽取出去

# # 0.自定义项目配置类
# class Config(object):
#     """项目配置类"""
#
#     # 开启debug模式
#     DEBUG = True
#
#     # mysql数据库配置信息
#     # mysql数据库连接配置
#     SQLALCHEMY_DATABASE_URI = "mysql://root:ljh1314520@192.168.19.113:3306/infomation"
#     # 开启数据库的追踪操作
#     SQLALCHEMY_TRACK_MODIFICATIONS = True
#
#     # Redis数据库配置信息
#     REDIS_HOST = "192.168.19.113"
#     REDIS_POST = 6379
#
#     # 将session存储的数据从内存转移到Redis中存储的配置信息
#     SECRET_KEY = "dsdasdsadsadsfffgasds"
#     # 指明数据库类型需要的Redis数据库
#     SESSION_TYPE = "redis"
#     # 创建真实存储数据库的对象进行赋值
#     SESSION_REDIS = StrictRedis(REDIS_HOST, REDIS_POST)
#     # session_id是否需要进行加密处理
#     SESSION_USE_SIGNER = True   # 默认是false True为加密
#
#     # 设置数据是否需要永久保存 默认true --> 永久保存
#     SESSION_PERMANENT = False
#     # 设置过期时长 默认数据31天过期  86400 == 一天
#     PERMANENT_SESSION_LIFETIME = 86400


# # 1.创建flask应用对象app
# app = Flask(__name__)
# # 把配置关联到app中
# app.config.from_object(Config)
#
# # 2. 创建数据库对象
# db = SQLAlchemy(app)
#
# # 3. 创建Redis数据库对象
# redis_store = StrictRedis(Config.REDIS_HOST, Config.REDIS_POST)
#
# # 4. 给项目添加csrf防护机制
# # 提取cookie中的csrf_token
# # 如果有表单提取form表单中的csrf_token,如果前端发送的ajax请求,则会从请求头中X-CSRFToken字段中提取csrf_token
# # 进行值的比对
# csrf = CSRFProtect(app)
#
# # 5. 将session存储的数据从内存转移到Redis中存储
# Session(app)


""" ************************** """

# 调用工厂方法 根据传入的参数不同获取不同配置的app。方便后期维护
app = create_app("development")

# 6. 创建管理类对象
manager = Manager(app)

# 7. 创建数据库迁移对象
Migrate(app, db)

# 8. 把迁移命令绑定到管理对象中
manager.add_command("db", MigrateCommand)


"""
使用方式：
    python manager.py createsuperuser -n "admin" -p "123456"
    python manager.py createsuperuser --name "admin" --password "123456"
"""
# 创建管理员用户
# 管理员名创建
@manager.option("-n", "--name", dest="name")
# 管理员密码创建
@manager.option("-p", "--password", dest="password")
def createsuperuser(name, password):
    """创建管理员用户"""

    # 非空判断
    if not all([name, password]):
        return "参数不足"

    # 创建管理员对象 ==> 就是创建User表  只是  is_admin字段的值 为 True
    user = User()
    user.mobile = name
    user.password = password
    user.nick_name = name
    user.is_admin = True

    # 添加到数据库
    try:
        # 创建mysql数据库User表
        db.session.add(user)
        # 提交数据
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        # 提交失败回滚
        db.session.rollback()
        return "保存管理员用户异常"

    return "创建管理员用户成功"



if __name__ == '__main__':
    # 运行项目,让程序运行,启动flask程序
    # print(app.url_map)  # 路由列表
    # app.run(debug=True)
    manager.run()  # 我在编辑配置中加了DEBUG模式 -->  parameters: runserver -d
